www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouS\PeerFileOperator.cpp

    // PeerFileOperator.cpp: implementation of the PeerFileOperator.
// Download by http://www.NewXing.com
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PeerFileOperator.h"
#include "command.h"
#include "peersocket.h"
#include "shellapi.h"

////////得到驱动器名称//////////////
bool PeerFileGetDriver(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	DRIVER driver;

	///////////发送////////////////
	char sdriver[10];
	int count=0;
	int maskdriver;
	int drivertype;
	if(!(maskdriver=GetLogicalDrives()))
		return false;
	for(int i=0;i<26;i++)
	{
		if(!(maskdriver>>i)) //得到所有驱动器号
			break;
		if(maskdriver>>i&1)
		{
			sdriver[0]=i+'A';
			sdriver[1]=':';
			sdriver[2]=0;
			drivertype=GetDriveType(sdriver);
			strcpy(driver.driver,sdriver);
			driver.drivertype=drivertype;
			PeerSendDataS(s,(char*)&driver,sizeof(driver),&retLen,
					 hEvent,SENDRECV_TIMEOUT);
		}
	}
	return true;
}
//////得到文件及其属性
bool PeerFileGetAttrib(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	HANDLE hFile;
	FILEATTRIB attrib;
	WIN32_FIND_DATA WFD;
	//得到需返回那个目录的文件信息
	if(!PeerRecvDataS(s,(char*)&attrib,sizeof(attrib),&retLen,
					 hEvent,SENDRECV_TIMEOUT))
					 return false;

	//查找第一个文件
	if((hFile=FindFirstFile(attrib.filename,&WFD))==INVALID_HANDLE_VALUE)
		return false;
	SHFILEINFO shfi;
	DWORD len;
	char slen[32];
	char stime[32];
	SYSTEMTIME systime;
	FILETIME localtime;
	memset(&shfi,0,sizeof(shfi));
	//得到文件的相关信息
	SHGetFileInfo(WFD.cFileName, 
			FILE_ATTRIBUTE_NORMAL,
			&shfi, sizeof(shfi),
			SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
	//写入文件信息结构
	strcpy(attrib.filename,WFD.cFileName);
	strcpy(attrib.attrib,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName);
	len=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024;
	sprintf(slen,"%dK",len);
	strcpy(attrib.len,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"":slen);
	//转化格林时间到本地时间
	FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime);
	FileTimeToSystemTime(&localtime,&systime);
	sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d",
		systime.wYear,systime.wMonth,systime.wDay,systime.wHour,
		systime.wMinute,systime.wSecond);
	strcpy(attrib.time,stime);
	//发送第一个文件信息
	if(strcmp(WFD.cFileName,".")!=0&&
				strcmp(WFD.cFileName,"..")!=0)
		PeerSendDataS(s,(char*)&attrib,sizeof(attrib),&retLen,
					 hEvent,SENDRECV_TIMEOUT);
	while(hFile)
	{
		//查完所有信息
		if(FindNextFile(hFile,&WFD))
		{
			if(strcmp(WFD.cFileName,".")==0||
				strcmp(WFD.cFileName,"..")==0)
				continue;
			memset(&shfi,0,sizeof(shfi));
			SHGetFileInfo(WFD.cFileName, 
				FILE_ATTRIBUTE_NORMAL,
				&shfi, sizeof(shfi),
				SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
			strcpy(attrib.filename,WFD.cFileName);
			strcpy(attrib.attrib,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName);
			len=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024;
			sprintf(slen,"%dK",len);
			strcpy(attrib.len,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"":slen);
			FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime);
			FileTimeToSystemTime(&localtime,&systime);
			sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d",
				systime.wYear,systime.wMonth,systime.wDay,systime.wHour,
				systime.wMinute,systime.wSecond);
			strcpy(attrib.time,stime);
			PeerSendDataS(s,(char*)&attrib,sizeof(attrib),&retLen,
					 hEvent,SENDRECV_TIMEOUT);
		}
		else
		{
			if(GetLastError()==ERROR_NO_MORE_FILES)
				break;
		}
	}
	FindClose(hFile);
	return true;
}

/////保存发送过来的文件///////////////////
bool PeerFileSave(SOCKET s,WSAEVENT hEvent)
{
	char buf[4096];
	bool iffalse=false;
	DWORD retLen;
	FILEINFO fi;
	while(1)
	{
		if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
						 hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
						 return false;
		FILE *fp;
		if(!(fp=fopen(fi.filename,"wb+")))
			return false;
		DWORD dwGetSize=0;
		while(dwGetSize<fi.filesize)
		{
			if(fi.filesize-dwGetSize>4096)
			{
				if(!PeerRecvDataS(s,buf,4096,&retLen,
							 hEvent,SENDRECV_TIMEOUT))
				{
					fclose(fp);
					DeleteFile(fi.filename);
					return false;
				}
				else
					if(fwrite(buf,sizeof(char),4096,fp)!=4096)
					{
						fclose(fp);
						DeleteFile(fi.filename);
						return false;
					}
					else
						dwGetSize+=4096;
			}
			else
			{
				if(!PeerRecvDataS(s,buf,fi.filesize-dwGetSize,&retLen,
							 hEvent,SENDRECV_TIMEOUT))
				{
					fclose(fp);
					DeleteFile(fi.filename);
					return false;
				}
				else
					if(fwrite(buf,sizeof(char),fi.filesize-dwGetSize,fp)!=fi.filesize-dwGetSize)
					{
						fclose(fp);
						DeleteFile(fi.filename);
						return false;
					}
					else
						dwGetSize+=fi.filesize-dwGetSize;
			}
		}
		fclose(fp);
	}
	return true;

}

/////////////发送文件到客户端///////////////
bool PeerFileSend(SOCKET s,WSAEVENT hEvent)
{
	char buf[4096];
	DWORD retLen;
	FILEINFO fi;
	while(1)
	{
		if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
						 hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
						 return false;
		FILE *fp;
		if(!(fp=fopen(fi.filename,"rb")))
			return false;
		DWORD dwGetSize=0;
		if(fseek(fp,0l,SEEK_END))
		{
			fclose(fp);
			return false;
		}
		if((dwGetSize=ftell(fp))==-1)
		{
			fclose(fp);
			return false;
		}
		if(fseek(fp,0l,SEEK_SET))
		{
			fclose(fp);
			return false;
		}
		fi.filesize=dwGetSize;
		if(!PeerSendDataS(s,(char*)&fi,sizeof(fi),&retLen,hEvent))
		{
			fclose(fp);
			return false;
		}
		DWORD fcount;
		while((fcount=fread(buf,sizeof(char),4096,fp)))
		{
			if(!PeerSendDataS(s,buf,fcount,&retLen,hEvent,SENDRECV_TIMEOUT)||retLen!=fcount)
			{
				fclose(fp);
				return false;
			}
		}
		fclose(fp);
	}
	return true;
}
/////创建文件夹
bool PeerFileDirCreate(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	FILEINFO fi;
	COMMAND com;
	if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
						 hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
						 return false;
	if(::CreateDirectory(fi.filename,NULL))
	{
		com.CommandID=PEER_CFM_OK;
	}
	else
	{
		com.CommandID=PEER_CFM_ERR;
	}
	PeerSendDataS(s,(char*)&com,sizeof(com),&retLen,
							 hEvent,SENDRECV_TIMEOUT);
	return true;

}
////////执行程序////////////
bool PeerFileExcute(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	FILEINFO fi;
	if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
						 hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
						 return false;
	ShellExecute(NULL, "open", fi.filename, NULL,NULL, SW_SHOWNORMAL);
	return true;
	
}
/////////删除文件或目录//////////////
bool PeerFileDelete(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	FILEINFO fi;
	COMMAND com;
	while(1)
	{
		if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
							 hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
							 return false;
		if(fi.dir)
		{
		  if(RemoveDirectory(fi.filename))
			 com.CommandID=PEER_CFM_OK;
		  else
			  com.CommandID=PEER_CFM_ERR;

		}
		else
		{
		  if(DeleteFile(fi.filename))
			  com.CommandID=PEER_CFM_OK;
		  else
			  com.CommandID=PEER_CFM_ERR;
		}
		PeerSendDataS(s,(char*)&com,sizeof(com),&retLen,
								 hEvent,SENDRECV_TIMEOUT);
	}
	return true;

}